一道莫队……….
最主要的就是怎么从当前区间推到相邻区间。
假设当前区间为 $[l,r]$ ,目标区间为 $[l,r+1]$ 。那么很显然这样子就会增加:
这些区间,现在我们要做的就是尽快的算出这些区间的答案。
假设 $p$ 为区间 $[l,r+1]$ 的最小值的位置,那么在上面的区间中,$[l,r+1] \cdots [p,r+1]$ 这些区间显然都包含了 $p$ ,也就是说这些区间的最小值都为 $p$ ,那么这一段区间的贡献显然为 $a[p]\cdot (p-l+1)$ ,其中 $a[p]$ 为 $p$ 位置上的权值。
很显然我们可以预处理一个 $ST$ 表,通过 $ST$ 表上面的 $p$ 就可以 $O(1)$ 求出。
然后接下来考虑剩下的 $[p+1,r+1]\cdots [r+1,r+1]$ 这些区间。
我们设 $f[i][j]$ 表示右端点为 $j$ ,左端点的位置在 $[i,j]$ 范围内的所有区间所造成的贡献。
我们可以用单调栈预处理出位置 $i$ 的 $lmin$ 和 $rmin$ ,$lmin[i]$ 表示 $i$ 往左走遇到的第一个比 $i$ 小的数的位置,$rmin$ 同理。
那么我们很轻易的可以得到:
发现 $i$ 是没有影响的,于是我们将 $i$ 丢掉。
这个式子 $DP$ 与处理一下就好了。
那么最后我们从 $[l,r]$ 移向 $[l,r+1]$ 产生的贡献为:
至于为什么要减去 $f[p]$ ,差不多是容斥的道理。
1 |
|
本文标题:【题解】 [HNOI2016]序列 莫队+ST表 luoguP3246
文章作者:Qiuly
发布时间:2019年03月14日 - 00:00
最后更新:2019年03月29日 - 13:54
原始链接:http://qiulyblog.github.io/2019/03/14/[题解]luoguP3246/
许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。